#pragma once

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <errno.h>
#include <error.h>
#include <sys/mman.h>
#include <sys/wait.h>
#include <time.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <signal.h>
#include <dirent.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <sys/epoll.h>
#include <assert.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <pthread.h>
#include <sys/uio.h>
#include <sys/sendfile.h>
#include <openssl/md5.h>

typedef enum {
    CMD_TYPE_PWD=1,
    CMD_TYPE_LS,
    CMD_TYPE_CD,
    CMD_TYPE_MKDIR,
    CMD_TYPE_RMDIR,
    CMD_TYPE_RMFILE,
    CMD_TYPE_LOGIN1,
    CMD_TYPE_LOGIN2,
    CMD_TYPE_PUTS,
    CMD_TYPE_GETS,
    CMD_TYPE_REG1,
    CMD_TYPE_REG2,
    CMD_TYPE_NOTCMD  //不是命令
}CmdType;

//消息类型                                                                   
typedef enum {
    MSG_TYPE_SUCCESS = 1,
    MSG_TYPE_DUPLICATE,
    MSG_TYPE_FAILURE,
    MSG_TYPE_NOT_EXIST,
    MSG_TYPE_WRONG_PASSWORD,
    MSG_TYPE_ERROR_MYSQL,
    MSG_TYPE_TRANSFER_SECOND,
    MSG_TYPE_TRANSFER_NORMAL
} MsgType;
//消息
typedef struct{
    int len;    //data中数据的长度                                           
    MsgType type;
    char data[1000];
} Msg;

typedef struct 
{
    int len;//记录内容长度
    CmdType type;//消息类型
    char buff[1000];//记录内容本身
} train_t; //发送命令的小火车

typedef struct 
{
    int len;//记录内容长度
    char buff[1000];//记录内容本身
} train_t2;  //发送数据的小火车

int tcpConnect(const char * ip, unsigned short port);
int loginFunc(int sockfd);
int registerFunc(int sockfd);

int recvn(int sockfd, void * buff, int len);
int sendn(int sockfd, const void * buff, int len);

//接收服务器传来的消息
int getMsg(int sockfd, Msg* m);
//向服务器发送命令
int sendCmd(int sockfd, CmdType type, char* data);

int getMD5(int filefd, int length, char* md5_hash);

int parseCommand(const char * input, int len, train_t * pt);

//判断一个字符串是什么命令
int getCommandType(const char * str);

//命令处理函数
void commandHandler(int sockfd, train_t* t);
